|
|
Dernière mise à jour : 20 Septembre 1999
Nous présentons dans ce chapitre l'unité MODELS, contenue dans le sous-répertoire REG de l'archive TPMATH1.ZIP. Cette unité a pour buts :
Chaque modèle de régression est défini dans une unité spécifique ayant un nom de la forme FIT*.PAS. D'une façon générale, vous n'aurez pas besoin d'accèder aux unités individuelles. Il suffit d'appeler directement les procédures de l'unité MODELS
Les procédures les plus importantes de l'unité MODELS sont les suivantes :
procedure InitModel(Reg_Model, Var_Model : Integer;
CstPar : PVector);
Cette procédure initialise les modèles de régression et de variance. Elle doit être appelée avant toutes les autres.
Le paramètre Reg_Model permet de choisir le modèle de régression. Les valeurs possibles sont :
REG_LIN { Linéaire :
y = a + bx }
REG_MULT { Linéaire multiple :
y = b0 + b1x1 + b2x2 + ... }
REG_POL { Polynôme :
y = b0 + b1x + b2x2 + ... }
REG_FRAC { Fraction rationnelle :
y = (p0 + p1x + p2x2 + ...) / (1 + q1x + q2x2 + ...) }
REG_EXPO { Somme d'exponentielles décroissantes :
y = Ymin + A1exp(-a1x) + A2exp(-a2x) + ... }
REG_IEXPO { Exponentielle croissante :
y = A[1 - exp(-kx)] }
REG_EXLIN { Exponentielle + linéaire :
y = A[1 - exp(-kx)] + Bx }
REG_POWER { Fonction puissance :
y = Axn }
REG_MICH { Equation de Michaelis :
y = Ymaxx / (Km + x) }
REG_HILL { Equation de Hill :
y = Ymaxxn / (Kn + xn) }
REG_LOGIS { Fonction logistique :
y = A + (B - A) / [1 + exp(-ax + b)] )
REG_PKA { Courbe de titrage acide/base :
y = A + (B - A) / (1 + 10pKa - x) }
Le paramètre Var_Model permet de choisir le modèle de variance, c'est-à-dire la relation entre la variance v d'une observation et la valeur mesurée y. Les valeurs possibles de ce paramètre sont :
VAR_CONST { Variance constante : v = e0 }
VAR_LIN { Fonction linéaire : v = e0(1 + e1y) }
VAR_POL2 { Polynôme de degré 2 : v = e0(1 + e1y + e2y2) }
VAR_POL3 { Polynôme de degré 3 : v = e0(1 + e1y + e2y2 + e3y3) }
VAR_EXPO { Fonction exponentielle : v = e0exp(e1y) }
VAR_POWER { Fonction puissance : v = e0ye1 }
Le paramètre e0 correspond à la variance résiduelle, qui est estimée par la procédure de régression. Les autres paramètres (e1, e2 ...) doivent être spécifiés par le programme appelant.
Le vecteur CstPar contient les paramètres constants du modèle de régression. Pour chaque modèle, la correspondance entre ces paramètres et les éléments du vecteur CstPar est décrite dans l'unité qui définit le modèle. Actuellement, ces paramètres sont requis dans les cas suivants :
function WLSFit(X : PVector;
U : PMatrix;
Y : PVector;
N : Integer;
Init : Boolean;
MaxIter : Integer;
Tol : Float;
Theta, B : PVector;
V : PMatrix;
Ycalc, S : PVector;
var Test : TRegTest) : Integer;
Cette fonction ajuste le modèle par régression pondérée (WLS = Weighted Least Squares = Moindres carrés pondérés). La signification des paramètres est la suivante :
En entrée
--------------------------------------------------------------------
X, U = Vecteur ou matrice des variables indépendantes
Y = Vecteur de la variable dépendante
N = Nombre d'observations
Init = TRUE pour calculer les valeurs initiales des
paramètres de la régression
FALSE pour utiliser les valeurs courantes
MaxIter = Nombre maximal d'itérations
(si 0 les paramètres ne seront pas affinés)
Tol = Précision requise sur les paramètres
Theta = Paramètres de la variance
En sortie
--------------------------------------------------------------------
Theta = Paramètres de la variance (les mêmes qu'en
entrée, avec en plus la variance résiduelle
stockée dans Theta^[0])
B = Paramètres de la régression
V = Matrice de variance-covariance des paramètres
Ycalc = Valeurs estimées de Y
S = Ecart-types des Y
Test = Tests de la régression
Notes :
Si l'on veut changer d'algorithme, il faut appeler la procédure SetRegAlgo ou SetOptAlgo avant la fonction WLSFit (voir cours sur la régression linéaire ou non linéaire).
La fonction retourne l'un des codes d'erreur suivants :
-------------------------------------------------------------------- Code Valeur Signification -------------------------------------------------------------------- MAT_OK 0 Pas d'erreur MAT_SINGUL -1 Matrice singulière BIG_LAMBDA -2 Paramètre de Marquardt trop grand NON_CONV -3 Non-convergence --------------------------------------------------------------------
Les procédures suivantes sont également disponibles :
function FuncName : String;
Retourne le nom de la fonction de régression (ex. 'y = a + b.x').
function FirstParam : Integer;
Retourne l'indice du premier paramètre de la régression (en général 0 ou 1).
function LastParam : Integer;
Retourne l'indice du dernier paramètre de la régression.
function ParamName(I : Integer) : String;
Retourne le nom du paramètre d'indice I.
function RegFunc(X : Float; B : PVector) : Float;
Calcule la fonction de régression dans le cas d'une variable indépendante.
function RegFuncNVar(X, B : PVector) : Float;
Calcule la fonction de régression dans le cas de plusieurs variables indépendantes.
procedure DerivProc(RegFunc : TRegFunc; X, Y : Float; B, D : PVector);
Calcule les dérivées partielles de la fonction de régression au point (X,Y) (pour la régression non linéaire uniquement). La dérivée par rapport au paramètre d'indice I est stockée dans D^[I].
function VarFuncName : String;
Retourne le nom de la fonction de variance (ex. 'v = e0.(1 + e1.y)').
function LastVarParam : Integer;
Retourne l'indice du dernier paramètre de la variance.
function VarFunc(Y : Float; Theta : PVector) : Float;
Calcule la variance d'une observation Y. Theta est le vecteur des paramètres de la variance.
Pour ajouter un nouveau modèle de régression non linéaire dans la bibliothèque, il faut tout d'abord écrire une unité spécifique. Le plus simple est de modifier une unité existante :
Dans tous les cas, vous devez adapter les procédures et fonctions suivantes :
FuncName FirstParam LastParam ParamName RegFunc DerivProc FitModel
Notes :
Si le modèle comporte des paramètres constants, il faut :
Afin d'intégrer le nouveau modèle dans la bibliothèque, vous devez faire les modifications suivantes dans MODELS.PAS :
<Identificateur_modèle> :
<Nom_procédure> := <Nom_unité_spécifique>.<Nom_procédure>;
Exemple :
REG_LIN : FuncName := FitLin.FuncName;
Pour ajouter un modèle de variance, il faut faire les modifications suivantes dans MODELS.PAS :
Les programmes suivants sont disponibles dans le sous-répertoire REG de l'archive TPMATH2.ZIP :
Ces programmes utilisent des procédures situées dans 3 fichiers à inclure :
L'essentiel des appels à la librairie MODELS se fait dans le programme principal :
{ Initialisation des modèles de régression et de variance.
Exemple de la régression multi-exponentielle }
InitModel(REG_EXPO,
VAR_CONST, { Ici nous utilisons une variance constante }
CstPar);
{ Dimensionnement des tableaux (appel aux fonctions LastParam et
LastVarParam de la librairie MODELS). Note: Les paramètres de la
variance, Theta^[1] à Theta^[LastVarParam], devraient être fournis
si nous utilisions un modèle de variance non constante }
DimVector(Theta, LastVarParam);
DimVector(B, LastParam);
DimMatrix(V, LastParam, LastParam);
DimVector(Ycalc, N);
DimVector(S, N);
{ Calcul de la régression. Les paramètres MAXITER et TOL sont ici des
constantes définies dans le programme principal. Pour la régression
linéaire ou polynômiale ils sont remplacés par des valeurs arbitraires }
ErrCode := WLSFit(X, U, Y, N, True, MAXITER, TOL,
Theta, B, V, Ycalc, S, RegTest);
Les principales fonctions et procédures définies dans ces programmes sont les suivantes :
Cette procédure lit les paramètres passés sur la ligne de commande. Ces paramètres sont :
Le nom du fichier d'entrée est retourné dans InFName. Les autres paramètres sont stockés dans le vecteur CstPar, qui est dimensionné par la procédure.
function ReadInputFile(InFName : String;
var Title, XName, YName : String;
var N : Integer;
var X, Y : PVector) : Integer;
Cette fonction (définie dans REG_IN.INC) lit le fichier de données. C'est un fichier ASCII dont la structure est la suivante :
Les fichiers suivants sont des exemples de fichiers de données :
Après lecture du nombre d'observations (N), les vecteurs X et Y sont dimensionnés à l'intérieur de la fonction.
procedure WriteOutputFile(InFName, Title, XName, YName : String;
N : Integer;
Y, Ycalc, S, B : PVector;
V : PMatrix;
Test : TRegTest);
Cette procédure (définie dans REG_OUT.INC) écrit les résultats dans un fichier de sortie. Le nom de ce dernier correspond à celui du fichier d'entrée, avec l'extension .OUT
Cette fonction (définie dans REG_PLOT.INC) correspond à l'équation de la courbe à tracer. Bien qu'elle soit en fait identique à la fonction RegFunc de l'unité MODELS, elle doit faire l'objet d'une déclaration indépendante car elle n'admet qu'un seul paramètre X qui représente l'abscisse du point à tracer. Les autres paramètres (ici le vecteur B) sont déclarés comme variables globales. Avec un compilateur 16 bits, la fonction doit être compilée en mode FAR ($F+).
{$F+}
function PlotRegFunc(X : Float) : Float;
begin
PlotRegFunc := RegFunc(X, B);
end;
{$F-}
procedure PlotGraph(Title : String;
X, Y : PVector;
N : Integer);
Cette procédure (également définie dans REG_PLOT.INC) trace les points expérimentaux et la courbe calculée. Elle utilise plusieurs fonctions et procédures de l'unité PLOT.PAS.
Ce programme de régression linéaire multiple suit les mêmes règles que les programmes précédents, avec quelques différences :
Le NIST propose plusieurs séries de données pour tester les programmes de régression. Les résultats ont été calculés avec un logiciel travaillant en multi-précision. Ils concernent les paramètres de régression, leurs écart-types, et les valeurs de s et (pour les modèles linéaires) de r2 et F. Nous avons utilisé les séries de données suivantes :
Les données sont rassemblées dans un fichier NIST.DAT. Le programme ajuste chaque modèle, trace le graphique et écrit les résultats dans un fichier NIST.OUT
Sous BP7 avec l'option de compilation EXTENDEDREAL (type Extended) nous avons obtenu les résultats suivants pour la précision des paramètres de la régression. La précision est définie par -log(|Erreur relative max.|). Elle correspond approximativement au nombre de chiffres significatifs trouvés par le programme.
Figure 1 : Précision des paramètres de la régression pour les données du NIST.
N = Norris, L = Longley, P = Pontius, W1-5 = Wampler 1 à 5, F = Filippelli, K = Kirby 2, T = Thurber, H = Hahn 1, M = MGH 17, La1-3 = Lanczos 1 à 3, B = Box BOD, Mi = Misra 1a, DW = Daniel-Wood, R = Ratkowsky 2
Notes :
Nous présentons ici quelques exemples empruntés au domaine de la Chimie.
Le fichier LINE.DAT contient les résultats relatifs à l'étalonnage d'une technique d'analyse (réponse du détecteur en fonction de la concentration du produit à doser).
Essayons tout d'abord de représenter les résultats par une droite :
On obtient le fichier de sortie suivant (Fichier LINE.OUT) :
========================================================================= Data file : line.DAT Study name : Linear regression x variable : X y variable : Y Function : y = b0 + b1.x ------------------------------------------------------------------------- Parameter Est.value Std.dev. t Student Prob(>|t|) ------------------------------------------------------------------------- b0 0.1847 0.0488 3.79 0.0323 b1 0.2901 0.0184 15.78 0.0006 ------------------------------------------------------------------------- Number of observations : n = 5 Residual error : s = 0.0465 Coefficient of determination : r2 = 0.9881 Adjusted coeff. of determination : r2a = 0.9841 Variance ratio (explained/resid.) : F = 248.8662 Prob(>F) = 0.0006 ------------------------------------------------------------------------- i Y obs. Y calc. Residual Std.dev. Std.res. ------------------------------------------------------------------------- 1 0.3770 0.4168 -0.0398 0.0465 -0.8554 2 0.6800 0.6489 0.0311 0.0465 0.6684 3 0.8930 0.8810 0.0120 0.0465 0.2579 4 1.1550 1.1131 0.0419 0.0465 0.9006 5 1.3000 1.3452 -0.0452 0.0465 -0.9715 =========================================================================
On constate que :
On est donc conduit à faire un essai avec un polynôme du second degré :
On obtient alors le fichier de sortie suivant :
========================================================================= Data file : line.DAT Study name : Linear regression x variable : X y variable : Y Function : y = b0 + b1.x + b2.x^2 ------------------------------------------------------------------------- Parameter Est.value Std.dev. t Student Prob(>|t|) ------------------------------------------------------------------------- b0 0.0512 0.0568 0.90 0.4624 b1 0.4332 0.0541 8.01 0.0152 b2 -0.0298 0.0111 -2.70 0.1145 ------------------------------------------------------------------------- Number of observations : n = 5 Residual error : s = 0.0265 Coefficient of determination : r2 = 0.9974 Adjusted coeff. of determination : r2a = 0.9949 Variance ratio (explained/resid.) : F = 387.9192 Prob(>F) = 0.0026 ------------------------------------------------------------------------- i Y obs. Y calc. Residual Std.dev. Std.res. ------------------------------------------------------------------------- 1 0.3770 0.3787 -0.0017 0.0265 -0.0626 2 0.6800 0.6680 0.0120 0.0265 0.4543 3 0.8930 0.9191 -0.0261 0.0265 -0.9875 4 1.1550 1.1322 0.0228 0.0265 0.8623 5 1.3000 1.3071 -0.0071 0.0265 -0.2666 =========================================================================
On constate :
Le graphique (Figure 2) confirme que le polynôme s'ajuste mieux aux points expérimentaux.
On vérifierait que l'utilisation d'un polynôme du troisième degré n'apporte aucune amélioration mais au contraire fait diminuer r2a et F.
Les données du fichier POLYNOM.DAT représentent la variation du pH d'une solution tampon contenant un solvant organique, en fonction de la concentration de ce dernier.
On montrerait comme dans l'exemple précédent que le meilleur ajustement est obtenu avec un polynôme du cinquième degré :
Les résultats sont les suivants :
========================================================================= Data file : polynom.DAT Study name : Polynomial regression x variable : X y variable : Y Function : y = b0 + b1.x + b2.x^2 + b3.x^3 + b4.x^4 + b5.x^5 ------------------------------------------------------------------------- Parameter Est.value Std.dev. t Student Prob(>|t|) ------------------------------------------------------------------------- b0 3.9626 0.0081 486.61 0.0000 b1 5.5081 0.6394 8.61 0.0001 b2 37.1571 14.8013 2.51 0.0459 b3 -355.0261 132.7627 -2.67 0.0368 b4 1089.7105 497.7389 2.19 0.0711 b5 -1173.8032 655.5657 -1.79 0.1236 ------------------------------------------------------------------------- Number of observations : n = 12 Residual error : s = 0.0090 Coefficient of determination : r2 = 0.9998 Adjusted coeff. of determination : r2a = 0.9997 Variance ratio (explained/resid.) : F = 6829.6214 Prob(>F) = 0.0000 ------------------------------------------------------------------------- i Y obs. Y calc. Residual Std.dev. Std.res. ------------------------------------------------------------------------- 1 3.9700 3.9626 0.0074 0.0090 0.8260 2 4.0300 4.0435 -0.0135 0.0090 -1.5082 3 4.1000 4.1049 -0.0049 0.0090 -0.5482 4 4.2000 4.1886 0.0114 0.0090 1.2666 5 4.2800 4.2788 0.0012 0.0090 0.1321 6 4.4700 4.4666 0.0034 0.0090 0.3761 7 4.6600 4.6671 -0.0071 0.0090 -0.7890 8 4.8300 4.8309 -0.0009 0.0090 -0.0970 9 4.9900 4.9851 0.0049 0.0090 0.5500 10 5.1200 5.1219 -0.0019 0.0090 -0.2108 11 5.2500 5.2501 -0.0001 0.0090 -0.0091 12 5.3700 5.3699 0.0001 0.0090 0.0115 =========================================================================
On constate que :
La figure suivante montre la courbe obtenue :
Les données du fichier INHIB.DAT représentent l'activité d'une série d'inhibiteurs enzymatiques (exprimée par la constante d'inhibition, pKi) en fonction de quelques caractéristiques structurales des molécules :
Nous allons traiter ces données par régression linéaire multiple avec présence d'un terme constant :
Les résultats sont les suivants :
========================================================================= Data file : INHIB.DAT Study name : Inhib. AChE x1 : E_LUMO x2 : V x3 : ICH2 x4 : ICS y : pKi Function : y = b0 + b1.x1 + b2.x2 + b3.x3 + b4.x4 ------------------------------------------------------------------------- Parameter Est.value Std.dev. t Student Prob(>|t|) ------------------------------------------------------------------------- b0 1.1268 0.6117 1.84 0.0820 b1 -0.4412 0.1239 -3.56 0.0022 b2 0.3136 0.0774 4.05 0.0007 b3 0.3872 0.1568 2.47 0.0238 b4 1.2070 0.1767 6.83 0.0000 ------------------------------------------------------------------------- Number of observations : n = 23 Residual error : s = 0.2294 Coefficient of determination : r2 = 0.8265 Adjusted coeff. of determination : r2a = 0.7879 Variance ratio (explained/resid.) : F = 21.4340 Prob(>F) = 0.0000 ------------------------------------------------------------------------- i Y obs. Y calc. Residual Std.dev. Std.res. ------------------------------------------------------------------------- 1 3.2100 3.5437 -0.3337 0.2294 -1.4545 2 3.9400 3.6901 0.2499 0.2294 1.0889 3 3.6600 3.7880 -0.1280 0.2294 -0.5577 4 3.9900 3.8715 0.1185 0.2294 0.5167 5 4.0600 3.9881 0.0719 0.2294 0.3133 6 4.0900 4.2140 -0.1240 0.2294 -0.5405 7 3.3600 3.4468 -0.0868 0.2294 -0.3782 8 3.9200 3.7725 0.1475 0.2294 0.6427 9 3.5800 3.5991 -0.0191 0.2294 -0.0830 10 4.2600 4.2276 0.0324 0.2294 0.1413 11 3.0600 3.6305 -0.5705 0.2294 -2.4866 12 4.1300 4.0312 0.0988 0.2294 0.4305 13 4.2700 4.2552 0.0148 0.2294 0.0645 14 4.3600 4.0316 0.3284 0.2294 1.4314 15 3.7200 3.4453 0.2747 0.2294 1.1974 16 3.8900 3.9531 -0.0631 0.2294 -0.2750 17 4.3900 4.3067 0.0833 0.2294 0.3632 18 3.9200 4.1756 -0.2556 0.2294 -1.1138 19 3.8900 3.9102 -0.0202 0.2294 -0.0882 20 5.1000 5.0705 0.0295 0.2294 0.1286 21 5.1400 5.1695 -0.0295 0.2294 -0.1286 22 3.6800 3.7879 -0.1079 0.2294 -0.4702 23 3.7000 3.4114 0.2886 0.2294 1.2580 =========================================================================
On constate que :
Les données proviennent de l'ouvrage de Gibaldi et Perrier (Pharmacokinetics, 2nd edition, Dekker 1982). Nous utiliserons comme exemple le fichier ORAL2.DAT (administration orale).
On montrerait, au moyen des graphiques et des critères r2a et F, que le meilleur ajustement est obtenu avec un modèle à 3 exponentielles sans terme constant.
On lance donc le programme par :
On obtient le fichier de sortie suivant (Fichier ORAL2.OUT) :
========================================================================= Data file : ORAL2.DAT Study name : Oral - 2 comp. x variable : Time y variable : Concentration Function : y = A1.exp(-a1.x) + A2.exp(-a2.x) + A3.exp(-a3.x) ------------------------------------------------------------------------- Parameter Est.value Std.dev. t Student Prob(>|t|) ------------------------------------------------------------------------- A1 -124.6229 0.9374 -132.94 0.0000 a1 0.4793 0.0025 188.79 0.0000 A2 89.4276 0.5411 165.28 0.0000 a2 0.1197 0.0020 59.48 0.0000 A3 35.1908 0.9746 36.11 0.0000 a3 0.0298 0.0005 55.85 0.0000 ------------------------------------------------------------------------- Number of observations : n = 15 Residual error : s = 0.0540 Coefficient of determination : r2 = 1.0000 Adjusted coeff. of determination : r2a = 1.0000 Variance ratio (explained/resid.) : F = 456548.8555 Prob(>F) = 0.0000 ------------------------------------------------------------------------- i Y obs. Y calc. Residual Std.dev. Std.res. ------------------------------------------------------------------------- 1 4.7000 4.6581 0.0419 0.0540 0.7758 2 13.2000 13.2163 -0.0163 0.0540 -0.3021 3 20.8000 20.8328 -0.0328 0.0540 -0.6071 4 36.3000 36.3213 -0.0213 0.0540 -0.3944 5 61.4000 61.3500 0.0500 0.0540 0.9260 6 68.1000 68.1102 -0.0102 0.0540 -0.1886 7 61.1000 61.1414 -0.0414 0.0540 -0.7675 8 52.1000 52.0859 0.0141 0.0540 0.2612 9 37.3000 37.2415 0.0585 0.0540 1.0840 10 27.5000 27.5250 -0.0250 0.0540 -0.4631 11 21.1000 21.1741 -0.0741 0.0540 -1.3732 12 16.9000 16.8431 0.0569 0.0540 1.0548 13 11.4000 11.4152 -0.0152 0.0540 -0.2810 14 8.2000 8.1437 0.0563 0.0540 1.0433 15 5.9000 5.9444 -0.0444 0.0540 -0.8231 =========================================================================
On constate que :
La courbe confirme l'excellent ajustement obtenu.
Nous utiliserons les données du fichier ENZYME.DAT qui représentent la vitesse initiale (v0) d'une réaction enzymatique en fonction de la concentration initiale (s0) du substrat. Ce type de relation est habituellement modélisé par des fractions rationnelles.
On montrerait, au moyen des graphiques et des critères r2a et F, que le meilleur ajustement est obtenu avec un numérateur et un dénominateur de degré 2, sans terme constant au numérateur.
On lance donc le programme par :
Les résultats sont les suivants :
========================================================================= Data file : ENZYME.DAT Study name : Enzyme kinetics x variable : s0 y variable : v0 Function : y = (p1.x + p2.x^2) / (1 + q1.x + q2.x^2) ------------------------------------------------------------------------- Parameter Est.value Std.dev. t Student Prob(>|t|) ------------------------------------------------------------------------- p1 0.6874 0.0904 7.61 0.0000 p2 0.2157 0.1212 1.78 0.1056 q1 4.1815 0.9754 4.29 0.0016 q2 0.7370 0.4254 1.73 0.1139 ------------------------------------------------------------------------- Number of observations : n = 14 Residual error : s = 0.0055 Coefficient of determination : r2 = 0.9878 Adjusted coeff. of determination : r2a = 0.9842 Variance ratio (explained/resid.) : F = 724.8827 Prob(>F) = 0.0000 ------------------------------------------------------------------------- i Y obs. Y calc. Residual Std.dev. Std.res. ------------------------------------------------------------------------- 1 0.0531 0.0582 -0.0051 0.0055 -0.9199 2 0.0907 0.0886 0.0021 0.0055 0.3754 3 0.1250 0.1214 0.0036 0.0055 0.6460 4 0.1560 0.1526 0.0034 0.0055 0.6141 5 0.1690 0.1698 -0.0008 0.0055 -0.1451 6 0.1780 0.1818 -0.0038 0.0055 -0.6772 7 0.1840 0.1909 -0.0069 0.0055 -1.2523 8 0.2220 0.2189 0.0031 0.0055 0.5555 9 0.2410 0.2342 0.0068 0.0055 1.2243 10 0.2470 0.2441 0.0029 0.0055 0.5188 11 0.2560 0.2636 -0.0076 0.0055 -1.3739 12 0.2660 0.2719 -0.0059 0.0055 -1.0672 13 0.2780 0.2765 0.0015 0.0055 0.2653 14 0.2850 0.2795 0.0055 0.0055 0.9985 =========================================================================
On constate que :
La figure suivante montre la courbe obtenue :